#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>

#define MAX_WAIT_SEC 26  // 最多等 60 秒
#define CHECK_INTERVAL 2 // 每 2 秒检查一次

// 检查 wwan0 是否有有效 IPv4 地址（非 0.0.0.0）
int has_valid_ip(const char *iface) {
    int sockfd;
    struct ifreq ifr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) return 0;

    strncpy(ifr.ifr_name, iface, IFNAMSIZ - 1);
    if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0) {
        close(sockfd);
        return 0;
    }
    close(sockfd);

    struct sockaddr_in *addr = (struct sockaddr_in *)&ifr.ifr_addr;
    uint32_t ip = ntohl(addr->sin_addr.s_addr);
    // 排除 0.0.0.0 和 169.254.x.x (link-local)
    return (ip != 0 && (ip >> 16) != 0xA9FE);
}

int main() {
    printf("4g wwan test start...\n");

    // 先确保 wwan0 存在且 up
    system("ip link set wwan0 up 2>/dev/null");

    // 启动 quectel-CM（前台运行更可控，或后台+监控）
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程：启动 quectel-CM，重定向日志可选
        execl("/usr/bin/quectel-CM", "quectel-CM", (char *)NULL);
        exit(1);
    } else if (pid < 0) {
        perror("fork failed");
        return -1;
    }

    // 父进程：等待 wwan0 获取有效 IP
    printf("等待 4G 网络连接...\n");
    int waited = 0;
    while (waited < MAX_WAIT_SEC) {
        if (has_valid_ip("wwan0")) {
            printf("wwan0 已获取有效 IP，开始测试连通性...\n");
            break;
        }
        sleep(CHECK_INTERVAL);
        waited += CHECK_INTERVAL;
    }

    if (waited >= MAX_WAIT_SEC) {
        printf("超时：wwan0 未获取有效 IP\n");
        // kill(pid, SIGTERM);
        printf("4G网络测试失败\n");
        system("echo \"$(date)：4G测试失败\" >> /userfs/all.txt");
        return -1;
    }

    sleep(5);  //确保稳定，不然会ping失败

    // 测试 ping（建议用 IP 避免 DNS 问题）
    int result = system("ping -I wwan0 -c 3 -W 2 220.181.38.148"); //114.114.114.114 不通

    if (result == 0) {
        printf("4G网络连接正常,可以成功访问外网！\n");
        printf("4G网络测试成功\n");
        system("echo \"$(date)：4G测试成功\" >> /userfs/all.txt");
    } else {
        printf("4G网络连接失败,无法访问外网。\n");
        printf("4G网络测试失败\n");
        system("echo \"$(date)：4G测试失败\" >> /userfs/all.txt");
        // kill(pid, SIGTERM);
        return -1;
    }

    // kill(pid, SIGTERM); // 结束 quectel-CM
    return 0;
}